МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
КАФЕДРА ІНФОРМАЦІЙНИХ СИСТЕМ ТА МЕРЕЖ
/
ЗВІТ
про виконання лабораторної роботи № 2
“ Засоби графічного виведення на екран”
з дисципліни “Проблемно-орієнтоване програмування”
Варіант 17
Львів 2016
Мета роботи: полягає у вивченні API-функцій для виведення текстової та графічної інформації у вікно програми для Windows.
Теоретичні відомості:
При посилці повідомлення WM_PAINT - Викликаємо функції малювання BeginPaint(),GetClientRect(), SetTextColor(), DrawText(), EndPaint(). За назвою видно, що ці функції роблять. Функція BeginPaint() в прямому сенсі починає малювати. Тільки для цього їй потрібно мати дескриптор вікна і об'єкт PAINTSTRUCT (у нас це ps). Вона повертає значення типу HDC, тому нам потрібно присвоїти їй hDc. GetClientRect() вибирає область. Параметри у неї аналогічні попередній функції: дескриптор вікна і покажчик на об'єкт класу RECT (у нас це rect). Функція SetTextColor()повертає колір тексту. Її параметри: повертається значення функції BeginPaint() - hDC і покажчик на об'єкт класу COLORREF. Ми могли і не задавати окремо колір тексту, створюючи при цьому змінну colorText, а могли зробити це прямо в ній. Але з точки зору читання коду і його тями - це в корені не правильно. Намагайтеся завжди оголошувати змінні окремо і писати в коментарях, навіщо вони потрібні і тоді не буде питань, які параметри має функція, через рік як ви останній раз закрили проект по WinAPI. Також дотримуйтесь угорську нотацію з програмування, суть якої: імена змінних повинні нести сенс їхнього існування і показувати тип даних. Оголошення функції DrawText():
1
3
4
5
6
7
int DrawText(
HDC hDC,// дескриптор контекста устр-ва
LPCTSTR lpchText, // указатель на нашу строку
int nCount, // длина текста (если равно -1, то определяет сам)
LPRECT lpRect, // указатель на объект RECT
UINT uFormat // формат отображения текста
);
На рахунок перших 4х параметрів все ясно. Четвертий uFormat - Має декілька видів. Зазвичай використовуються DT_SINGLELINE, DT_CENTER і DT_VCENTER для відображення тексту в центрі області, в одну лінію. Але Ви можете змінити параметри (про що поговоримо в наступних уроках). Функція EndPaint() має два параметри: дескриптор вікна і об'єкт ps. Помітили аналогію з BeginPaint()? Що робити при виклику WM_PAINT, ми знаємо (не забуваємо в
кінці дописати break).WM_DESTROY надсилається віконця функцією DestroyWindow(), яка викликається у разі, якщо ми його закрили. А це відбувається в операторі default.
Варіант №17
Порядок виконання роботи
Написати програму (або змінити наведену у роботі програму) для виведення графіка функції:
/
Код програми:
#include "stdafx.h"
#include "Resource.h"
#include <math.h>
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
wchar_t szClassName[] = L"GraphClass";
typedef struct
{
wchar_t name[20];
float x[50];
float y[50];
} FUNC;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpszCmdLine, int nCmdShow)
{
MSG msg;
HWND hwnd;
::hInstance = hInstance;
if (!RegClass(WndProc, szClassName, COLOR_WINDOW))
return FALSE;
hwnd = CreateWindow(szClassName, L"Гpaфік функції y=sinh(x)", WS_OVERLAPPEDWINDOW
| WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 1500, 1000, 0, 0,
hInstance, NULL);
if (!hwnd) return FALSE;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
return msg.wParam;
}
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbClsExtra = wc.cbWndExtra = 0;
wc.lpfnWndProc = Proc;
wc.hInstance = hInstance;
wc.lpszClassName = szName;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SMALL));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(HBRUSH)(brBackground + 2);
wc.lpszMenuName = NULL;
return (RegisterClass(&wc) != 0);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa...